package 简易文件比较工具;

import java.io.*;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 备注：这是个人使用工具，仅学习参考用
 * 根据用户提供的正则匹配规则，找出两个相似文件中匹配的关键字，并将匹配出来的两组数据进行对比，输出两组数据及其相同与不同的部分
 */
public class Main {
    private static final String FILE_ONE = "src/main/java/简易文件比较工具/test1.txt";
    private static final String FILE_TWO = "src/main/java/简易文件比较工具/test2.txt";
    // 匹配模式
    private static final String PATTERN = "\\[dbo\\]\\.\\[[^\\]]+\\]";

    public static void main(String[] args) {
        Main main = new Main();
        try {
            ArrayList<String> wordsOne = main.scanFile(FILE_ONE);
            ArrayList<String> wordsTwo = main.scanFile(FILE_TWO);
            ArrayList<String> samePart = main.compare(wordsOne, wordsTwo);

            main.printResult(wordsOne, wordsTwo, samePart);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private void printResult(ArrayList<String> wordsOne, ArrayList<String> wordsTwo, ArrayList<String> samePart) {
        System.out.println("第一个文件中的可匹配元素：" + wordsOne);
        System.out.println("元素个数：" + wordsOne.size());
        System.out.println();
        System.out.println("第二个文件中的可匹配元素：" + wordsTwo);
        System.out.println("元素个数：" + wordsTwo.size());
        System.out.println();
        System.out.println("相同的元素：" + samePart);
        wordsOne.removeAll(samePart);
        System.out.println("第一个文件不同的部分：" + wordsOne);
        wordsTwo.removeAll(samePart);
        System.out.println("第二个文件不同的部分：" + wordsTwo);
    }

    // 比较两组数据，找出相同的部分
    private ArrayList<String> compare(ArrayList<String> wordsOne, ArrayList<String> wordsTwo) {
        ArrayList<String> results = new ArrayList<>();

        for (String value : wordsOne) {
            if (wordsTwo.contains(value)) {
                results.add(value);
            }
        }

        return results;
    }

    // 根据正则规则扫描文件，返回匹配成功的数据组
    private ArrayList<String> scanFile(String path) throws IOException {
        ArrayList<String> matchingValues = new ArrayList<>();
        try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
            String line;
            while ((line = reader.readLine()) != null) {
                Pattern pattern = Pattern.compile(PATTERN);
                Matcher matcher = pattern.matcher(line);
                if (matcher.find()) {
                    // operateString();
                    matchingValues.add(matcher.group());
                }
            }
        }

        return matchingValues;
    }

    // 对要输出的原始匹配元素进行修饰（有需求可实现）
//    private String operateString(String row) {
//        String result;
//
//
//        return result;
//    }
}
